#pragma once
#include <mujoco/mujoco.h>
#include <random>
#include <vector>
#include <functional>

namespace sensor {
// 噪声类型枚举
enum class NoiseType {
    GAUSSIAN,   // 高斯噪声
    UNIFORM,    // 均匀噪声
    NONE        // 无噪声
};

// 传感器噪声生成器类
class NoiseGenerator {
public:
    NoiseGenerator();
    
    // 配置噪声参数
    void configureNoise(NoiseType type, double amplitude);
    
    // 应用噪声到传感器数据
    double applyNoise(double sensorValue);
    
private:
    NoiseType noiseType;
    double noiseAmplitude;
    std::mt19937 generator;
    std::normal_distribution<double> normalDist;
    std::uniform_real_distribution<double> uniformDist;
};

// 传感器噪声管理器类
class NoiseManager {
public:
    // 获取单例实例
    static NoiseManager& getInstance();
    
    // 初始化 - 为模型中的所有传感器创建噪声生成器
    void initialize(const mjModel* model);
    
    // 配置特定传感器的噪声
    void configureSensor(int sensorIndex, NoiseType type, double amplitude);
    
    // 应用噪声到指定传感器
    double applySensorNoise(int sensorIndex, double value);
    
    // 应用噪声到所有传感器（新增）
    void applyNoiseToAllSensors(const mjModel* m, mjData* d);
    
    // 日志记录噪声应用情况（可选）
    void logNoiseApplication(const mjModel* m, mjData* d, bool verbose = false);
    
private:
    NoiseManager() = default;
    ~NoiseManager() = default;
    
    std::vector<NoiseGenerator> noiseGenerators;
    bool initialized = false;
};
} // namespace sensor
